package main.编程题;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author tmh
 * @date 2024/8/1 16:33
 * @description
 *
 * 【暴力解法】
 * 用两个队列来实现
 * 一个队列里面的元素移动到另一个队列里面的时候，元素的顺序不变，这个是队列的特性
 * 所以我们会弹出queueIn里面的元素到还剩一个的时候，这个元素就是我们的栈顶元素
 */
public class T225用队列实现栈 {
    Queue<Integer> queueIn;
    Queue<Integer> queueTemp;

    public T225用队列实现栈() {
        queueIn = new LinkedList<>();
        queueTemp = new LinkedList<>();

    }

    public void push(int x) {
        queueIn.offer(x);
    }

    public int pop() {
        if (queueIn.isEmpty()) {
            throw new RuntimeException();
        }
        while (queueIn.size() > 1) {
            queueTemp.offer(queueIn.poll());
        }
        //把queueIn剩下的那一个元素弹出来
        Integer element = queueIn.poll();
        //这一步的目的就是为了清空queueTemp
        Queue<Integer> temp = queueIn;
        queueIn = queueTemp;
        queueTemp = temp;
        return element;

    }

    /**
     * 步骤和pop相同
     * @return
     */
    public int top() {
        if (queueIn.isEmpty()) {
            throw new RuntimeException();
        }
        while (queueIn.size() > 1) {
            queueTemp.offer(queueIn.poll());
        }
        //把queueIn剩下的那一个元素弹出来
        Integer element = queueIn.poll();
        //这一步的目的就是为了清空queueTemp，然后把element在加入到queueIn里面
        Queue<Integer> temp = queueIn;
        queueIn = queueTemp;
        queueTemp = temp;
        queueIn.offer(element);
        return element;
    }

    /**
     * 如果queue为空，那么栈就是为空的
     *
     * @return
     */
    public boolean empty() {
        return queueIn.isEmpty();
    }
}
